// 请求封装模块
import axios from 'axios'
import store from '@/store'
import { Message } from 'element-ui'
import router from '@/router'

const service = axios.create({
  // 根据输入的输入的变量来切换生产环境还是开发环境，在终端输入npm run dev就是开发环境，npm run build就是生产环境
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  // 等待5秒发送请求，超过5秒就不会等待了
  timeout: 5000 // request timeout
})
// 请求拦截器
service.interceptors.request.use(config => {
  // console.log('444', store)
  // console.log(config)
  if (store.state.user.token) {
    const loginTime = localStorage.getItem('loginTime')
    const now = Date.now()
    const maxTime = 1000 * 60 * 60 * 24
    if (now - loginTime < maxTime) {
      config.headers.Authorization = `Bearer ${store.state.user.token}`
    } else {
      // 超时的主动介入
      // 超过1天,清除登录的信息
      // 登出, 跳到登录页
      store.dispatch('user/logout')
      router.push('/login')
      // 拒绝掉当前请求
      return Promise.reject(new Error('token超时(主动介入)'))
    }
  }
  // }
  return config
})
// 响应拦截器 每次请求的响应都会经过这里的回调函数

service.interceptors.response.use(res => {
  // console.log('333', res)
  // 请求200进入
  if (res.status === 200) {
    // 数据发送成功
    return res
  } else {
    // 数据错误,出错提示
    console.log('数据错误, 应该有提示')
  }
}, err => {
  // 状态码200以外的其他错误
  console.log('硬性网络错误', err)

  if (err.response && err.response.status === 400) {
    Message.error(err.response.data.data[0].messages[0].message)
    return Promise.reject(err)
  } else if (err.response && err.response.data.statusCode === 401 && err.response) {
    store.dispatch('user/logout')
    router.push('/login')
    Message.error('token错误,请重新登录')
    // 前端返回一个错误信息
    return Promise.reject(err)
  }
  Message.error(err.message)
  return Promise.reject(err)
})

export default service
